/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Estructuras;

import java.util.Observable;
import java.util.Observer;

/**
 *
 * @author necross
 */
public class SO implements Observer, Runnable {
  //Lista de task struct
  private task_list tl;
  
  //Scheduler de procesos
  private Scheduler sche;


  /**
   * Constructor que recibe el Sche
   */
  public SO(Scheduler sche){
     this.tl =  new task_list() ;
     this.sche = sche;
  }


  /**
   * Agrega un nuevo proceso al task_list y al scheduller
   */
  public void crearProceso(Task_struct ts){
    //Lo agrega a la task_list
    this.tl.Insert(ts);
    //Lo agrega al Scheduler
    sche.enqueue_task(ts);
    
  }

  
  public void update(Observable o, Object o1) {
    //Proceso que se ejecuta al momento de que cambie el objeto observado
    //Revisa si hay un proceso en el Task_List que no haya sido eliminado
    //Inicia el Hilo que verifica si hay procesos por eliminar
    Thread th = new Thread(this);
    th.start();
  }

  public void run() {
    this.recorrerTaskList();
  }


  //Revisa la lista en busqueda de un proceso que este marcado
  //para ser eliminado
   public void recorrerTaskList(){
      Task_struct ts;
      if(this.tl != null){
         nodo head;
         head = tl.getHead();
         if(head == null)
              return;
         int tam = head.tam;
         System.out.println("Buscando procesos no agregados y muertos");
         while(tam!= 0){
              //solicito el task list
              ts = head.getPcb();
              //no ha sido agregado al Scheduller y estado no es wait
              if(ts.getSC() == null){
                  //lo agrega al sche uler
                  this.sche.enqueue_task(ts);
              }
              //Verificar si el nodo fue marcado para ser eliminado
              switch(ts.getState()){
                case Task_struct.TERMINATED:
                  //se elimina de la lista
                  this.tl.Remove(ts.getPid());
                  System.out.println("Eliminando pid="+ts.getPid());
                  break;
                case Task_struct.BLOCKED:
                  //actualiza espera por IO
                  break;
                default:
              }
              if(head == null)
                   return;
              head = head.getNext();
              tam--;

         }
      }
  }

}
